#  -*- coding:utf-8 -*- 
"""
@ author: 罗金盛
@ time: 2023/10/7 
@ file: 垃圾邮件分类.py

"""
"""使用matplotlib显示Sklearn中digits dataset 的其中一副数字图像"""
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits

# 加载digits dataset
digits = load_digits()

# 获取第一副图像
image = digits.images[0]  # 这后面的下标可以修改 从0开始 就是第n+1副图像

# 显示图像
plt.imshow(image, cmap="gray")
plt.axis("off")
plt.show()
"""
个人解释：这段代码首先导入了matplotlib.pyplot和sklearn.datasets.load_digits模块。然后，使用load_digits()函数加载digits dataset，并将其赋值给变量digits。接下来，从digits中获取第一副图像，并将其赋值给变量image。然后，使用imshow()函数将图像显示出来，使用灰度色彩映射(cmap="gray")以灰度形式显示图像，使用axis()函数关闭坐标轴。最后，使用show()函数显示图像。
"""


"""sklearn朴素贝叶斯实现语料垃圾邮件数据分类
https://pan.baidu.com/s/1R8r345ZAAxnpbwGKy_r4VA?pwd=iziv
"""
# 导入所需的库
import pandas as pd  # 用于导入csv
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

# 读取两个csv文件里的数据 我这里设置了两个不同的文件 便于训练和测试
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')
# 定义标签，即每个邮件是垃圾邮件还是非垃圾邮件（0表示非垃圾邮件，1表示垃圾邮件）
labels = train_data['v1']
list1=[]

# 由于csv文件里没有给0或1 所以这里要自己设置成0和1
for i in labels:
    if(i=='ham'):
        list1.append(0)
    if (i == 'spam'):
        list1.append(1)
labels=list1

# 定义训练邮件数据
corpus = train_data['v2']

# 创建CountVectorizer对象，用于将文本转化为数值特征向量
vectorizer = CountVectorizer()

# 将文本数据fit到CountVectorizer对象上，并将其转化为数值特征向量
X = vectorizer.fit_transform(corpus)

# 创建MultinomialNB对象，用于构建朴素贝叶斯分类器
clf = MultinomialNB()

# 将特征向量和标签拟合到分类器中，完成模型训练
clf.fit(X, labels)

# 定义测试数据
test_corpus = test_data['v2']

# 将测试数据转化为数值特征向量
X_test = vectorizer.transform(test_corpus)

# 使用训练好的分类器进行预测
predictions = clf.predict(X_test)

# 打印预测结果
for i, pred in enumerate(predictions):
    if pred == 1:
        print(f'第 {i+1} 封邮件是垃圾邮件')
    else:
        print(f'第 {i+1} 封邮件不是垃圾邮件')
